﻿using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Xml.Linq;

namespace Class05_数组_列表_集合
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //1、列表        List<T> 构造函数
            var names = new List<string> { "sanzk", "Ana", "lisi" };//字符串列表
            foreach (var name in names)
            {
                Console.WriteLine($"HELLO {name.ToUpper()}");
            }


            names.Add("wangwu");//列表中添加项
            names.Remove("Ana");//列表中移除项

            Console.WriteLine("---------------");

            foreach (var name in names)
            {
                Console.WriteLine($"HELLO {name.ToUpper()}");
            }

            Console.WriteLine("---------------");

            for (var i = 0; i < names.Count; i++)
            {
                Console.WriteLine($"HELLO {names[i].ToUpper()}");
            }

            Console.WriteLine("---------------");

            //2、按索引输出列表内容
            Console.WriteLine(names[0]);//索引

            //3、反向查找列表内容的索引
            var index = names.IndexOf("lisi");
            Console.WriteLine($"找到李四在列表索引{index}位置");

            
            Console.WriteLine("-------未排序--------");
            Printlist(names);
            Console.WriteLine("--------未排序-------");
            //4、列表 排序
            names.Sort();
            Console.WriteLine("-------排序之后--------");
            Printlist(names);
            Console.WriteLine("--------排序之后-------");

            var num = new List<int> { 9, 8, 10, 5 };//字符串列表


            Printlist(num);

            num.Sort();

            Print分隔符();

            Printlist(num);

            Print分隔符();

            fibonachinumber();




        }
        //   方法（可以理解为：函数、功能块）的创建，将列表作为参数
        static void Printlist(List<string> lists)
        {
            foreach (var list in lists)
            {
                Console.WriteLine(list);
            }
        }
        static void Printlist1(List<int> lists)
        {
            foreach (var list in lists)
            {
                Console.Write($" {list} ");
            }
        }
        //重载  ，同一个方法名，不同的参数类型
        static void Printlist(List<int> lists)
        {
            foreach (var list in lists)
            {
                Console.WriteLine(list);
            }
        }

        static void Print分隔符()
        {
            Console.WriteLine("---------------");
        }

        /// <summary>
        /// 斐波那契序列
        /// </summary>
        static void fibonachinumber()
        {
            var fibonachiNumber = new List<int> { 1,1};

            while (fibonachiNumber.Count<20)
            {
                var p1 = fibonachiNumber[fibonachiNumber.Count - 1];
                var p2 = fibonachiNumber[fibonachiNumber.Count - 2];
                fibonachiNumber.Add(p1 + p2);//使用断点，和F5（开始调试、继续），可以看到列表每次执行后的变化
                //使用断点 + F11(逐语句)或F10(逐过程)可以看到变化的过程
            }
            
           Printlist1(fibonachiNumber);
        }

        //数组的声明
        string[] myArray;

        //数组的静态初始化
        int[] myarray = { 1, 2, 3};

        //数组的动态初始化
        int[] myarray2 = new int[3];


        /*
         C#中，将字符以,分割，存储到数组中
        // 假设有一个包含逗号的字符串
        string text = "a,b,c,d,e";

        // 使用Split方法以逗号为分隔符分割字符串
        string[] characters = text.Split(',');

         */
        /*
        在C#中，数组（Array）是固定大小的，一旦创建就不能改变其大小。如果您需要往数组中增加新的元素，您可以使用以下几种方法：

创建新数组并复制旧数组元素：您可以创建一个新的更大的数组，然后将旧数组中的所有元素复制到新数组中，再在新数组的末尾添加新元素。
int[] originalArray = { 1, 2, 3 };
        int[] newArray = new int[originalArray.Length + 1];

for (int i = 0; i<originalArray.Length; i++)
{
    newArray[i] = originalArray[i];
}
    newArray[newArray.Length - 1] = 4; // 添加新元素

// newArray 现在为 { 1, 2, 3, 4 }
使用System.Array.CopyTo方法：这是一种更简洁的方式来复制数组。
int[] originalArray = { 1, 2, 3 };
    int[] newArray = new int[originalArray.Length + 1];

    originalArray.CopyTo(newArray, 0);
newArray[newArray.Length - 1] = 4; // 添加新元素

// newArray 现在为 { 1, 2, 3, 4 }
使用System.Linq命名空间中的Append方法：如果您使用的是.NET Core 3.0或更高版本，可以使用System.Linq中的Append方法。
using System.Linq;

int[] originalArray = { 1, 2, 3 };
    int[] newArray = originalArray.Append(4).ToArray();

    // newArray 现在为 { 1, 2, 3, 4 }
    使用List<T> 替代数组：在许多情况下，使用List<T> 比使用数组更方便，因为List<T> 是可变大小的，可以直接使用Add方法添加新元素。
List<int> list = new List<int> { 1, 2, 3 };
    list.Add(4); // 直接添加新元素

// list 现在为 { 1, 2, 3, 4 }
如果需要将List<T> 转换回数组，可以使用List<T>.ToArray方法。
选择哪种方法取决于您的具体需求，例如性能考虑、代码的简洁性、是否需要频繁地添加或移除元素等。
*/
    }
}